#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
#include <errno.h>

void daemonize() {
    pid_t pid = fork();

    if (pid < 0) {
        perror("Fork failed");
        exit(1);
    }
    else if (pid > 0) {
        // 父进程退出
        exit(0);
    }

    // 打开新的会话
    if (setsid() < 0) {
        perror("Failed to create new session");
        exit(1);
    }

    // 设置工作目录为根目录
    chdir("/");

    // 重设文件权限掩码
    umask(0);

    // 关闭标准输入、标准输出和标准错误输出
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

    // 创建日志文件并打开输出流
    FILE* file = fopen("/tmp/out", "a");
    if (file == NULL) {
        perror("Failed to open out file");
        exit(1);
    }
    setbuf(file, NULL);  // 不阻塞写入操作
    
    int number = 0;  // 从0开始计数
    // 循环向文件添加数字，直到退出或发生错误
    while (1) {
        // 将数字写入文件并加1，直到退出或发生错误
        
        fprintf(file, "%d\n", number);  // 将数字写入文件
        number++;  // 加1到下一个数字
        fflush(file);  // 确保数据立即写入文件
        sleep(1);  // 休眠1秒，继续添加下一个数字到文件中
        // 检查是否有错误发生，如果有则退出守护进程
        if (errno != 0) {
            perror("Error occurred");
            fclose(file);  // 关闭文件，退出守护进程
            exit(1);
        }
    }
}

int main() {
    daemonize();  // 创建守护进程并启动循环添加数字任务
    return 0;
}
